10REM >WORD
20REM  *****************************
30REM  SPELLING WORD PROCESSOR
40REM  (c) 1989   J. Ansell
50REM  *****************************
60:
70MODE 9
80PROCREADPAL
90PROCBUTTON(480,600,"SPELLWORD",4,10)
100PRINT TAB(8,28)"Copyright J. Ansell 1989"
110PRINT TAB(0,31);
120:
130DICTSTEP%=7           :REM  NO. OF LINES STEPED THROUGH DICTIONARY
140DICTMAX%=800          :REM  DICTIONARY SIZE
150TEXTSTEP%=5           :REM  NO. OF LINES STEPED THROUGH TEXT
160TEXTMAX%=200          :REM  TEXT SIZE
170LL%=39                :REM  LINE LENGTH
180                      :REM  SET PATHNAME FOR LOAD AND SAVE
190PATH$="<OBEY$DIR>.STORIES"
200                      :REM  SET PATHNAME FOR DICTIONARY FILE
210DICTFILE$="<OBEY$DIR>.DICTIONARY"
220:
230                       REM  MOUSE MASKS
240MMASK1%=7             :REM  FOR ALL ACTIONS EXCEPT DICTIONARY CONTROL
250MMASK2%=2             :REM  STEP THROUGH DICTIONARY
260MMASK3%=4             :REM  COPY WORD FROM DICTIONARY TO TEXT
270:
280ON ERROR PROCEXIT(1)
290OI%=0:OJ%=0:OY%=0
300*FX11,0
310*FX202,48
320*FX4,1
330DIM DICT$(DICTMAX%),DEND$(DICTMAX%),DPOINT%(27),TEXT$(TEXTMAX%)
340DIM BLOCK% 100
350PROCREADDICT
360*POINTER 1
370MOUSE ON
380:
390PROCMENU
400PROCINITTEXT
410PROCUPTEXT
420PROCUPDICT
430MOUSE TO 64,960
440:
450REM  MAIN LOOP
460REPEAT
470REPEAT
480PROCINMOUSE
490PRINT TAB(X%,Y%*2+1);
500WORD$=FNGETWORD
510UNTIL WORD$<>""
520PROCANALWORD
530PROCUPTEXT
540UNTIL FALSE
550:
560DEF PROCANALWORD:     REM  ANALYSE KEY INPUT
570IF LEN(WORD$)=1 THEN
580KEY%=ASC(WORD$)
590IF KEY%=136 PROCLEFT:ENDPROC
600IF KEY%=137 PROCRIGHT:ENDPROC
610IF KEY%=138 PROCDOWN:ENDPROC
620IF KEY%=139 PROCUP:ENDPROC
630IF KEY%=127 PROCDELETE:ENDPROC
640IF KEY%=8  PROCBACKSPACE:ENDPROC
650IF KEY%=13 PROCRETURN:ENDPROC
660IF KEY%<32 OR KEY%>127 ENDPROC
670ENDIF
680PROCINSERT(WORD$)
690ENDPROC
700:
710DEF PROCINMOUSE:      REM  ANALYSE MOUSE POSITION
720LOCAL MX%,MY%,MB%,S$
730:
740MOUSE MX%,MY%,MB%
750MB%=MB%AND MMASK1%
760IF NOT(MX%>1180 OR MY%<548) THEN ENDPROC
770IF MB%=0 THEN ENDPROC
780REPEAT
790MOUSE MX%,MY%,MB%
800MB%=MB%AND MMASK1%
810UNTIL MB%=0
820:                     REM  RIGHT HAND MENU BAR
830IF MX%>1216 AND MY%>544 THEN
840IF MY%>856 AND DST%<>DPOINT%(27) THEN DST%-=DICTSTEP%
850IF MY%<710 AND DST%<>DPOINT%(27) THEN DST%+=DICTSTEP%
860IF MY%<808 AND MY%>760 THEN DC%=0:DST%=0
870IF DST%<0 THEN DST%=0
880IF DST%>DPOINT%(27) THEN DST%=DPOINT%(27)-1
890PROCUPDICT
900ENDPROC
910ENDIF
920:                     REM  MIDDLE MENU BAR
930IF MY%>488 AND MY%<536 THEN
940IF MX%>96   AND MX%<256  THEN PROCEXIT(0) :ENDPROC
950IF MX%>288  AND MX%<480  THEN PROCCLEAR   :ENDPROC
960IF MX%>512  AND MX%<704  THEN PROCPRINT   :ENDPROC
970IF MX%>736  AND MX%<896  THEN PROCSAVE    :ENDPROC
980IF MX%>928  AND MX%<1088 THEN PROCLOAD    :ENDPROC
990IF MX%>1150 AND MX%<1210 THEN PROCTEXTUP  :ENDPROC
1000IF MX%>1220 AND MX%<1280 THEN PROCTEXTDOWN:ENDPROC
1010ENDIF
1020:
1030IF MY%<480 THEN
1040                      REM MOVE CURSOR
1050X%=MX%/32
1060Y%=7-MY%/64
1070ENDIF
1080ENDPROC
1090:
1100DEF FNGETWORD:        REM GET WORD FROM SCREEN AT POINTER POSITION (MOUSE)
1110LOCAL I%,J%,MX%,MY%,MB%,S$,KEY%,S2$,SMX%,SMY%,SMB%
1120:
1130MOUSE MX%,MY%,MB%
1140MB%=MB%AND (MMASK2% OR MMASK3%)
1150IF MX%<16 OR MX%>1180 OR MY%<548 THEN
1160                                     REM  NOT IN DICTIONARY AREA
1170GCOL 0,1
1180RECTANGLE OI%,OY%,OJ%,64
1190OI%=0:OY%=0:OJ%=0
1200=INKEY$(0)
1210ENDIF
1220                      REM  CALCULATE POSITION OF RECTANGLE
1230MX%=(MX%-16)/32+1
1240MY%=(988-MY%)/64
1250S$=FNFILL(" "+DICT$(MY%+DST%))
1260I%=MX%+1
1270REPEAT
1280I%=I%-1
1290UNTIL INSTR(" ",MID$(S$,I%,1))>0
1300J%=MX%
1310REPEAT
1320J%=J%+1
1330UNTIL INSTR(" ",MID$(S$,J%,1))>0
1340NOI%=I%*32-8
1350NOY%=942-MY%*64
1360NOJ%=(J%-I%)*32-20
1370:
1380IF OI%<>NOI% OR OY%<>NOY% THEN
1390                      REM  PLOT RECTANGLE IF MOVED
1400GCOL 0,1
1410RECTANGLE OI%,OY%,OJ%,64
1420GCOL 0,15
1430RECTANGLE NOI%,NOY%,NOJ%,64
1440OI%=NOI%:OY%=NOY%:OJ%=NOJ%
1450ENDIF
1460:
1470IF MB%=0 THEN =INKEY$(0):REM EXIT IF NO BUTTONS PRESSED
1480REPEAT
1490MOUSE SMX%,SMY%,SMB%
1500SMB%=SMB%AND (MMASK2% OR MMASK3%)
1510UNTIL SMB%=0
1520S$=FNMAKESPACE(MID$(S$,I%+1,J%-I%-1))
1530:
1540IF MB%= MMASK3% THEN
1550                       REM  SELECT WORD FROM DICTIONARY
1560DST%=0:DC%=0
1570PROCUPDICT
1580=S$
1590ENDIF
1600                       REM  UPDATE DICTIONARY
1610:
1620IF INSTR(PUNC$,S$)<>0  OR S$="" THEN =INKEY$(0) :REM  PUNCTUATION NOT VALID
1630:
1640IF LEN(S$)=1 THEN DC%=ASC(S$)-96:DST%=DPOINT%(DC%):S$="":PROCUPDICT:=INKEY$(0)
1650:
1660                       REM  PUT WORD ENDINGS INTO S2$
1670S2$=DEND$(MY%+DST%)
1680I%=INSTR(S2$,"/"+FNDEFILL(S$))
1690IF I%<>0 THEN
1700S2$=MID$(S2$,I%+1)
1710I%=INSTR(S2$,"/")
1720S2$=LEFT$(S2$,I%-1)
1730ELSE
1740S2$=S$
1750ENDIF
1760                       REM  LOAD ENDINGS INTO DICT$
1770J%=DPOINT%(27)
1780FOR I%=J% TO J%+7:DICT$(I%)=" ":NEXT
1790REPEAT
1800I%=INSTR(S2$," ")
1810:
1820IF I%=0 THEN
1830DICT$(J%)="              "+S2$+"~"
1840S2$=""
1850ELSE
1860DICT$(J%)="              "+LEFT$(S2$,I%-1)+"~"
1870S2$=MID$(S2$,I%+1)
1880ENDIF
1890:
1900J%+=1
1910UNTIL S2$=""
1920:
1930DC%=27:DST%=DPOINT%(27)
1940PROCUPDICT
1950MOUSE TO 550,960
1960=INKEY$(0)
1970:
1980DEF PROCINSERT(S$):   REM  INSERT STRING INTO TEXT
1990LOCAL SP%,J%
2000IF INSTR(PUNC2$,S$)>0 THEN
2010                      REM  INSERT PUNCTUATION
2020J%=X%
2030WHILE MID$(TEXT$(Y%+SS%),J%,1)=" " AND J%>0
2040J%-=1
2050ENDWHILE
2060IF J%=0 THEN J%=X%
2070ELSE
2080J%=X%
2090ENDIF
2100                      REM  INSERT STRING S$
2110TEXT$(Y%+SS%)=FNDEFILL(LEFT$(TEXT$(Y%+SS%),J%)+S$+MID$(TEXT$(Y%+SS%),J%+1))
2120IF LEN(TEXT$(Y%+SS%))>LL%-1 THEN
2130SP%=FNFORMAT(Y%+SS%)
2140J%=J%+LEN(S$)
2150IF J%>SP% THEN PROCDOWN:X%=J%-SP% ELSE X%=J%
2160ELSE
2170TEXT$(Y%+SS%)=FNFILL(TEXT$(Y%+SS%))
2180X%=X%+LEN(S$)
2190ENDIF
2200ENDPROC
2210:
2220DEF FNFORMAT(N%):     REM  FORMAT TEXT FROM LINE N%
2230                      REM  RETURNS POSITION OF SPLIT IN LINE N%
2240LOCAL S$,I%,J%
2250I%=LL%+1
2260REPEAT
2270I%-=1
2280UNTIL MID$(TEXT$(N%),I%,1)=" " OR I%=0
2290IF I%=0 THEN I%=LL%-1:                  REM  WORD LONGER THAN LINE
2300:
2310IF (N%+1)>TEXTMAX% THEN
2320                                        REM  ON LAST LINE OF TEXT$
2330TEXT$(N%)=FNFILL(LEFT$(TEXT$(N%),LL%-1))
2340=LL%-1
2350ENDIF
2360IF LEFT$(TEXT$(N%+1),1)<>" " THEN
2370                                        REM  CONTINUE FORMATING
2380TEXT$(N%+1)=FNDEFILL(MID$(TEXT$(N%),I%+1))+" "+FNDEFILL(TEXT$(N%+1))
2390TEXT$(N%)=FNFILL(LEFT$(TEXT$(N%),I%))
2400IF LEN(TEXT$(N%+1))>LL% THEN J%=FNFORMAT(N%+1) ELSE TEXT$(N%+1)=FNFILL(TEXT$(N%+1))
2410ELSE
2420                                        REM  STOP FORMATING
2430IF LEN(FNDEFILL(TEXT$(N%))) > LL%-1 THEN
2440PROCINLIN(N%+1)
2450TEXT$(N%+1)=FNFILL(MID$(TEXT$(N%),I%+1))
2460TEXT$(N%)=FNFILL(LEFT$(TEXT$(N%),I%))
2470ELSE
2480TEXT$(N%)=FNFILL(TEXT$(N%))
2490ENDIF
2500ENDIF
2510=I%
2520:
2530DEF PROCMENU:         REM  SET UP MENU WINDOW
2540LOCAL A%
2550VDU 23,128,0,&10,&38,&6C,&C6,&82,0,0
2560VDU 23,129,0,0,&82,&C6,&6C,&38,&10,0
2570VDU 23,130,0,&10,&38,&6C,&6C,&38,&10,0
2580GCOL 0,5
2590RECTANGLE 0,480,1279,543
2600RECTANGLE FILL 0,480,1280,63
2610RECTANGLE FILL 1216,480,63,543
2620PROCBUTTON(96,488,"Exit",7,0)
2630PROCBUTTON(288,488,"Clear",7,0)
2640PROCBUTTON(512,488,"Print",7,0)
2650PROCBUTTON(736,488,"Save",7,0)
2660PROCBUTTON(928,488,"Load",7,0)
2670FOR A%=856 TO 944 STEP 44
2680PROCBUTTON(1220,A%,CHR$(128),4,10)
2690NEXT
2700FOR A%=572 TO 660 STEP 44
2710PROCBUTTON(1220,A%,CHR$(129),4,10)
2720NEXT
2730PROCBUTTON(1220,760,CHR$(130),4,10)
2740PROCBUTTON(1220,488,CHR$(129),0,4)
2750PROCBUTTON(1150,488,CHR$(128),0,4)
2760ENDPROC
2770:
2780DEF PROCTOPW:         REM DEFINE TOP TEXT WINDOW
2790COLOUR 7
2800GCOL 0,128+1
2810COLOUR 128+1
2820VDU 28,1,14,37,1
2830VDU 24,4;544;1212;1016;
2840OI%=0:OY%=0:OJ%=0
2850ENDPROC
2860:
2870DEF PROCBOTTOMW:      REM DEFINE BOTTOM TEXT WINDOW
2880COLOUR 4
2890COLOUR 128
2900VDU 28,0,31,39,17
2910ENDPROC
2920:
2930DEF PROCCLEAR:        REM  INITIALISE TEXT$
2940IF FNCHECKACTION("clear the text") THEN PROCINITTEXT
2950PROCUPDICT
2960PROCUPTEXT
2970ENDPROC
2980:
2990DEF PROCINITTEXT:     REM CLEAR TEXT
3000FOR I%=0 TO TEXTMAX%
3010TEXT$(I%)=FNFILL("")
3020NEXT
3030X%=1:Y%=0:SS%=0
3040DC%=0
3050DST%=0
3060ENDPROC
3070:
3080DEF PROCBUTTON(X%,Y%,TEXT$,BC%,FC%):  REM DRAW BUTTON
3090GCOL BC%
3100RECTANGLE FILL X%,Y%,32*(LEN(TEXT$)+1)-12,47
3110MOVE X%+16,Y%+36
3120GCOL FC%
3130VDU 5
3140PRINT TEXT$;
3150VDU 4
3160ENDPROC
3170:
3180DEF PROCUPTEXT:       REM  UPDATE TEXT ON SCREEN
3190LOCAL I%
3200PROCBOTTOMW
3210CLS
3220FOR I%=0 TO 6
3230PRINT
3240PRINT TEXT$(I%+SS%)
3250NEXT
3260PRINT TAB(X%,Y%*2+1);
3270ENDPROC
3280:
3290DEF FNFILL(ST$):=LEFT$(ST$+STRING$(40," "),LL%):REM ADD " "s TO LL% CHARACTERS
3300:
3310DEF FNDEFILL(ST$):    REM  REMOVE TRAILING SPACES FROM STRING
3320LOCAL I%
3330I%=LEN(ST$)+1
3340REPEAT
3350I%-=1
3360UNTIL MID$(ST$,I%,1)<>" " OR I%=0
3370=LEFT$(ST$,I%)
3380:
3390DEF FNDELEAD(ST$):    REM  REMOVE LEADING SPACES FROM STRING
3400LOCAL I%
3410I%=0
3420REPEAT
3430I%+=1
3440UNTIL MID$(ST$,I%,1)<>" " OR I%>LEN(ST$)
3450=MID$(ST$,I%)
3460:
3470DEF PROCLEFT:         REM  MOVE CURSOR LEFT
3480X%-=1
3490IF X%<0 THEN X%=LL%
3500ENDPROC
3510:
3520DEF PROCRIGHT:        REM  MOVE CURSOR RIGHT
3530X%+=1
3540IF X%>LL% THEN X%=0
3550ENDPROC
3560:
3570DEF PROCUP:           REM  MOVE CURSOR UP
3580IF Y%=0 THEN
3590IF SS%=0 THEN ENDPROC ELSE SS%-=1
3600ELSE
3610Y%-=1
3620ENDIF
3630ENDPROC
3640:
3650DEF PROCDOWN:         REM  MOVE CURSOR DOWN
3660IF Y%=6 THEN
3670IF SS%>FNLASTLINE-4 THEN ENDPROC ELSE SS%+=1
3680ELSE
3690Y%=Y%+1
3700ENDIF
3710ENDPROC
3720:
3730DEF PROCTEXTUP:       REM  MOVE CURSOR UP BY TEXTSTEP%
3740SS%-=TEXTSTEP%
3750IF SS%<0 THEN SS%=0
3760PROCUPTEXT
3770ENDPROC
3780:
3790DEF PROCTEXTDOWN:     REM  MOVE CURSOR DOWN BY TEXTSTEP%
3800LOCAL L%
3810L%=FNLASTLINE
3820SS%+=TEXTSTEP%
3830IF SS%>L%-4 THEN SS%=L%-4
3840IF SS%>TEXTMAX%-TEXTSTEP% THEN SS%=TEXTMAX%-TEXTSTEP%
3850IF SS%<0 THEN SS%=0
3860PROCUPTEXT
3870ENDPROC
3880:
3890DEF PROCDELETE:       REM  DELETE CHARACTER ABOVE CURSOR
3900LOCAL S$,J%
3910TEXT$(Y%+SS%)=FNFILL(LEFT$(TEXT$(Y%+SS%),X%)+MID$(TEXT$(Y%+SS%),X%+2))
3920S$=FNDEFILL(TEXT$(Y%+SS%))+" "
3930IF LEFT$(TEXT$(Y%+SS%+1),1)<>" " THEN
3940TEXT$(Y%+SS%)=S$+FNDEFILL(TEXT$(Y%+SS%+1))
3950PROCDELIN(Y%+SS%+1)
3960IF LEN(TEXT$(Y%+SS%)) > LL%-1 THEN J%=FNFORMAT(Y%+SS%) ELSE TEXT$(Y%+SS%)=FNFILL(TEXT$(Y%+SS%))
3970ENDIF
3980ENDPROC
3990:
4000DEF PROCBACKSPACE:    REM  DELETE CHARACTER TO LEFT OF CURSOR
4010LOCAL S$,J%
4020IF X%=0 THEN
4030IF Y%=0 THEN
4040IF SS%=0 THEN ENDPROC ELSE SS%-=1
4050ELSE
4060Y%-=1
4070ENDIF
4080                      REM  AT START OF LINE(JOIN TWO LINES)
4090S$=FNDEFILL(TEXT$(Y%+SS%))+" "
4100X%=LEN(S$)
4110TEXT$(Y%+SS%)=S$+FNDEFILL(TEXT$(Y%+SS%+1))
4120PROCDELIN(Y%+SS%+1)
4130IF LEN(TEXT$(Y%+SS%)) > LL%-1 THEN J%=FNFORMAT(Y%+SS%) ELSE TEXT$(Y%+SS%)=FNFILL(TEXT$(Y%+SS%))
4140ENDPROC
4150ENDIF
4160:
4170TEXT$(Y%+SS%)=FNFILL(LEFT$(TEXT$(Y%+SS%),X%-1)+MID$(TEXT$(Y%+SS%),X%+1))
4180X%=X%-1
4190S$=FNDEFILL(TEXT$(Y%+SS%))+" "
4200IF LEFT$(TEXT$(Y%+SS%+1),1)<>" " THEN
4210TEXT$(Y%+SS%)=S$+FNDEFILL(TEXT$(Y%+SS%+1))
4220PROCDELIN(Y%+SS%+1)
4230IF LEN(TEXT$(Y%+SS%)) > LL%-1 THEN J%=FNFORMAT(Y%+SS%) ELSE TEXT$(Y%+SS%)=FNFILL(TEXT$(Y%+SS%))
4240ENDIF
4250ENDPROC
4260:
4270DEF PROCSIMDEL:       REM  SIMPLE DELETE CHARACTER
4280IF X%=0 THEN ENDPROC
4290TEXT$(Y%+SS%)=FNFILL(LEFT$(TEXT$(Y%+SS%),X%-1)+MID$(TEXT$(Y%+SS%),X%+1))
4300X%=X%-1
4310ENDPROC
4320:
4330DEF PROCRETURN:       REM  BREAK LINE AT RETURN
4340LOCAL J%
4350IF Y%+SS%>=TEXTMAX% THEN ENDPROC
4360IF LEFT$(TEXT$(Y%+SS%+1),1) = " " THEN PROCINLIN(Y%+SS%+1)
4370TEXT$(Y%+SS%+1)=" "+FNDELEAD(FNDEFILL(MID$(TEXT$(Y%+SS%),X%+1)))+" "+FNDELEAD(FNDEFILL(TEXT$(Y%+SS%+1)))
4380TEXT$(Y%+SS%)=FNFILL(LEFT$(TEXT$(Y%+SS%),X%))
4390IF LEN(TEXT$(Y%+SS%+1)) > LL%-1 THEN J%=FNFORMAT(Y%+SS%+1) ELSE TEXT$(Y%+SS%+1)=FNFILL(TEXT$(Y%+SS%+1))
4400X%=1
4410IF Y%=6 THEN
4420IF SS%>TEXTMAX%-TEXTSTEP% THEN ENDPROC ELSE SS%+=1
4430ELSE
4440Y%=Y%+1
4450ENDIF
4460ENDPROC
4470:
4480DEF PROCINLIN(YP%):   REM  INSERT BLANK LINE AT Y%=YP%
4490LOCAL I%
4500FOR I%=TEXTMAX% TO YP% STEP -1
4510TEXT$(I%)=TEXT$(I%-1)
4520NEXT
4530TEXT$(YP%)=""
4540ENDPROC
4550:
4560DEF PROCDELIN(YP%):   REM  INSERT BLANK LINE AT Y%=YP%
4570LOCAL I%
4580FOR I%=YP% TO TEXTMAX%-1
4590TEXT$(I%)=TEXT$(I%+1)
4600NEXT
4610TEXT$(TEXTMAX%)=FNFILL("")
4620ENDPROC
4630:
4640DEF PROCREADDICT:     REM  READ DICTIONARY FILE
4650LOCAL CHANNEL%,I%,J%,XLIN$,XL$,C$,RLIN$,R%
4660CHANNEL%=OPENIN DICTFILE$
4670I%=0
4680J%=0
4690DPOINT%(J%)=I%
4700REM ruler "...................................." dictionary ruler
4710DICT$(I%)="a b c d e f g h i j k l m    . , ! "
4720I%+=1
4730DICT$(I%)="n o p q r s t u v w x y z    ? "" "
4740I%+=1
4750PUNC$=".!?"","    :REM  ALL PUNCTUATION MARKS IN DICTIONARY
4760PUNC2$=".!?,"     :REM  SKIP BACK OVER SPACE PUNCTUATION MARKS
4770DICT$(I%)=" "
4780I%+=1
4790C$=" "
4800DICT$(I%)=""
4810REPEAT
4820RLIN$=GET$#CHANNEL%
4830:
4840XL$=CHR$(ASC(LEFT$(RLIN$,1)) OR &20)
4850IF LEFT$(RLIN$,1)=" " THEN RLIN$=MID$(RLIN$,3)
4860:
4870R%=INSTR(RLIN$," ",1)
4880IF R%=0 THEN XLIN$=RLIN$ ELSE XLIN$=LEFT$(RLIN$,R%-1)
4890:
4900IF RIGHT$(XLIN$,1)="*" THEN
4910XLIN$=LEFT$(XLIN$,LEN(XLIN$)-1)
4920LEFT$(XLIN$,1)=CHR$(ASC(XLIN$)-&20)
4930RLIN$=""
4940ENDIF
4950:
4960XLIN$+="~"
4970IF LEN(DICT$(I%)+XLIN$)>36 OR C$<>XL$ THEN
4980IF C$<>XL$ THEN I%+=1:DICT$(I%)=" ":DEND$(I%)="":J%+=1:DPOINT%(J%)=I%+1:C$=XL$
4990I%+=1
5000DICT$(I%)=XLIN$+" "
5010DEND$(I%)="/"+RLIN$
5020ELSE
5030DICT$(I%)+=XLIN$+" "
5040DEND$(I%)+="/"+RLIN$
5050ENDIF
5060:
5070UNTIL EOF#CHANNEL%
5080CLOSE#CHANNEL%
5090I%+=1
5100J%+=1
5110DPOINT%(J%)=I%
5120ENDPROC
5130:
5140DEF PROCUPDICT:       REM  UPDATE DICTIONARY
5150LOCAL I%,J%,DEN%
5160PROCTOPW
5170CLG
5180REM  Print dictionary.
5190DEN%=DST%+6
5200:
5210IF DEN%>DPOINT%(27) AND DST%<>DPOINT%(27) THEN
5220DEN%=DPOINT%(27)-1
5230FOR I%=DPOINT%(27) TO DPOINT%(27)+7
5240DICT$(I%)=""
5250NEXT
5260ENDIF
5270:
5280J%=0
5290FOR I%=DST% TO DEN%
5300PRINT TAB(0,J%);FNMAKESPACE(DICT$(I%));
5310J%+=2
5320NEXT
5330PROCBOTTOMW
5340ENDPROC
5350:
5360DEF FNMAKESPACE(S$):  REM REPLACE "~" WITH " " IN STRING S$
5370LOCAL S2$,S3$,I%
5380FOR I%=1 TO LEN(S$)
5390S3$=MID$(S$,I%,1)
5400IF S3$="~" THEN S2$+=" " ELSE S2$+=S3$
5410NEXT
5420=S2$
5430:
5440DEF PROCPRINT:        REM  PRINT TEXT
5450LOCAL Y%,S$,LAST%
5460IF FNCHECKACTION("print the text") THEN
5470LAST%=FNLASTLINE
5500VDU 2
5510IF FNPRLIN(CHR$(10)+CHR$(10))<>0 THEN PROCUPDICT:ENDPROC
5540:
5550FOR Y%=0 TO LAST%
5560S$="     "+TEXT$(Y%)+CHR$(10)
5570IF FNPRLIN(S$)<>0 THEN Y%=LAST%
5580NEXT
5600:
5605IF FNPRLIN(CHR$(10)+CHR$(10))<>0 THEN PROCUPDICT:ENDPROC
5610VDU 3
5620ENDIF
5630PROCUPDICT
5640ENDPROC
5650:
5660DEF FNPRLIN(S$)       REM  PRINT LINE RETURNS 0 IF NO PRINTER ERROR
5670LOCAL X%,F%
5680:
5690F%=0
5700FOR X%=0 TO LEN(S$)
5710VDU 1,ASC(MID$(S$,X%,1))
5720IF FNCHECKQ<>0 THEN F%=1:X%=LEN(S$)
5730NEXT
5740=F%
5750:
5760DEF FNCHECKQ:         REM  CHECK PRINTER QUEUE IS EMPTYING
5770LOCAL T%
5780IF ADVAL(-4)>2 THEN =0
5790T%=TIME
5800REPEAT UNTIL TIME>T%+500 OR ADVAL(-4)>2
5810IF ADVAL(-4)>2 THEN =0
5820VDU 3:                REM  PRINTER OFF AND FLUSH BUFFER
5830*FX 21,3
5840PROCERROR("The printer will not print!")
5850=1
5860:
5870DEF PROCERROR(S$)
5880LOCAL X%,Y%,T%,B%
5890X%=600-LEN(S$)*16
5900PROCBUTTON(X%,560,S$,4,10)
5910T%=TIME
5920REPEAT MOUSE X%,Y%,B%:B%=B%AND MMASK1%:UNTIL TIME>T%+2000 OR B%<>0
5930REPEAT MOUSE X%,Y%,B%:UNTIL B%=0
5940ENDPROC
5950:
5960DEF FNLASTLINE:       REM  FIND LAST LINE OF TEXT
5970LOCAL LAST%,S$
5980S$=FNFILL("")
5990LAST%=TEXTMAX%
6000REPEAT
6010LAST%-=1
6020UNTIL TEXT$(LAST%)<>S$ OR LAST%=0
6030=LAST%
6040:
6050DEF PROCEXIT(I%):     REM  CHECK FOR EXIT CONDITION
6060IF I%=0 THEN IF FNCHECKACTION("exit") THEN
6070*FX 4 0
6080*FX 11 32
6090*FX 202 0
6100IF I%<>0 THEN
6110REPORT
6120PRINT " at line ";ERL
6130ELSE
6140MODE 12
6150ENDIF
6160END
6170ELSE
6180PROCUPDICT
6190ENDIF
6200ENDPROC
6210:
6220DEF PROCSAVE:         REM  SAVE TEXT
6230LOCAL I%,F$,F%,LAST%
6240LOCAL ERROR
6250ON ERROR LOCAL PROCERROR("Can not save story - NO DISC!"):PROCUPDICT:ENDPROC
6260IF FNCHECKACTION("save the text") THEN
6270:
6280I%=FNREADDIR(PATH$)
6290IF I%=-1 THEN PROCERROR("Can not save story - NO DISC!"):PROCUPDICT:ENDPROC
6300IF I%>=25 THEN PROCERROR("Too many stories have been saved!"):PROCUPDICT:ENDPROC
6310:
6320PROCPFILES("SAVE STORY")
6330F$=FNGETFILE
6340DC%=0:DST%=0
6350F%=OPENOUT(PATH$+"."+F$)
6360IF F%=0 THEN PROCERROR("Can not save story - NO DISC!"):PROCUPDICT:ENDPROC
6370LAST%=FNLASTLINE
6380FOR I%=0 TO LAST%
6390BPUT#F%,TEXT$(I%)
6400NEXT
6410CLOSE#F%
6420ENDIF
6430PROCUPDICT
6440ENDPROC
6450:
6460DEF PROCLOAD:         REM  LOAD TEXT
6470LOCAL I%,F$,F%
6480LOCAL ERROR
6490ON ERROR LOCAL PROCERROR("Can not load story - NO DISC!"):PROCUPDICT:ENDPROC
6500IF FNCHECKACTION("load some new text") THEN
6510:
6520I%=FNREADDIR(PATH$)
6530IF I%=0 OR I%=-1 THEN PROCERROR("There are no stories to load!"):PROCUPDICT:ENDPROC
6540:
6550PROCPFILES("LOAD STORY")
6560F$=FNGETFILE
6570DC%=0:DST%=0
6580F%=OPENIN(PATH$+"."+F$)
6590IF F%=0 THEN PROCERROR("There is no story named '"+F$+"'!"):PROCUPDICT:ENDPROC
6600                      REM  CLEAR TEXT
6610FOR I%=0 TO TEXTMAX%
6620TEXT$(I%)=FNFILL("")
6630NEXT
6640                      REM  LOAD TEXT
6650I%=0
6660REPEAT
6670TEXT$(I%)=GET$#F%
6680I%+=1
6690UNTIL EOF#F%
6700CLOSE#F%
6710X%=1:Y%=0:SS%=0
6720PROCUPTEXT
6730:
6740ENDIF
6750PROCUPDICT
6760ENDPROC
6770:
6780DEF FNGETFILE:        REM  GET FILE NAME
6790LOCAL S$,S2$,I%,J%,MX%,MY%,MB%,ST$
6800MOUSE RECTANGLE 0,544,1216,480
6810S2$=""
6820REPEAT
6830:
6840MOUSE MX%,MY%,MB%
6850MB%=MB%AND MMASK1%
6860:
6870MX%=(MX%-16)/32+1
6880MY%=(988-MY%)/64
6890S$=FNFILL(" "+DICT$(MY%+DPOINT%(27)))
6900I%=MX%+1
6910REPEAT
6920I%=I%-1
6930UNTIL INSTR(" ",MID$(S$,I%,1))>0
6940J%=MX%
6950REPEAT
6960J%=J%+1
6970UNTIL INSTR(" ",MID$(S$,J%,1))>0
6980NOI%=I%*32-8
6990NOY%=942-MY%*64
7000NOJ%=(J%-I%)*32-20
7010:
7020IF (OI%<>NOI% OR OY%<>NOY%) AND MY%>0 AND MY%<6 THEN
7030GCOL 0,1
7040RECTANGLE OI%,OY%,OJ%,64
7050GCOL 0,15
7060RECTANGLE NOI%,NOY%,NOJ%,64
7070OI%=NOI%:OY%=NOY%:OJ%=NOJ%
7080ENDIF
7090:
7100IF MB%<>0 THEN
7110REPEAT
7120MOUSE MX%,MY%,MB%
7130MB%=MB%AND MMASK1%
7140UNTIL MB%=0
7150:
7160IF MX%>736 AND MX%<832 AND MY%>550 AND MY%<614 THEN
7170S$=CHR$(13)
7180ELSE
7190S$=MID$(S$,I%+1,J%-I%-1)
7200ENDIF
7210:
7220ELSE
7230S$=INKEY$(0)
7240ENDIF
7250:
7260ST$=CHR$(8)+CHR$(13)+"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
7270IF LEN(S$)>1 OR INSTR(ST$,S$) ELSE S$=""
7280IF S$<>"" THEN
7290:
7300IF S$=CHR$(8) THEN
7310S2$=LEFT$(S2$,LEN(S2$)-1)
7320ELSE
7330IF S$<>CHR$(13) THEN S2$+=S$
7340IF LEN(S$)>1 THEN S2$=S$
7350ENDIF
7360:
7370IF LEN(S2$)>6 THEN S2$=LEFT$(S2$,6)
7380PROCBUTTON(496,550,LEFT$(S2$+"      ",6),3,10)
7390ENDIF
7400UNTIL S$=CHR$(13) AND S2$<>""
7410MOUSE RECTANGLE 0,0,1280,1024
7420=S2$
7430:
7440DEF PROCPFILES(S$):     REM  PRINT SET OF FILENAMES
7450LOCAL I%,J%
7460PROCTOPW
7470CLG
7480PRINT TAB(14,0);S$
7490J%=2
7500COLOUR 10
7510FOR I%=DPOINT%(27)+1 TO DPOINT%(27)+6
7520PRINT TAB(0,J%);DICT$(I%)
7530J%+=2
7540NEXT
7550PROCBUTTON(496,550,"      ",3,10)
7560PROCBUTTON(736,550,"OK",3,10)
7570ENDPROC
7580:
7590DEF FNCHECKACTION(S$)  :REM  CHECK ACTION REQUIRED
7600LOCAL X%,Y%,B%,A%
7610PROCTOPW
7620CLG
7630PRINT TAB(8,3);"Do you really want to"
7640PRINT TAB(18-LEN(S$)/2,5);S$;" ?"
7650PROCBUTTON(400,650,"Yes",7,0)
7660PROCBUTTON(750,650,"No",7,0)
7670VDU 23,1,0,0,0,0,0,0,0,0
7680:
7690A%=-1
7700REPEAT
7710REPEAT
7720MOUSE X%,Y%,B%
7730B%=B% AND MMASK1%
7740UNTIL B%<>0
7750:
7760REPEAT
7770MOUSE X%,Y%,B%
7780B%=B% AND MMASK1%
7790UNTIL B%=0
7800:
7810IF Y%>650 AND Y%<698 THEN
7820IF X%>400 AND X%<528 THEN A%=1
7830IF X%>750 AND X%<846 THEN A%=0
7840ENDIF
7850UNTIL A%<>-1
7860VDU 23,1,1,0,0,0,0,0,0,0
7870=A%
7880:
7890DEF PROCREADPAL
7900LOCAL I%,F%
7910F%=OPENIN("<OBEY$DIR>.!PALETTE")
7920FOR I%=0 TO 15
7930VDU 19,I%,16,BGET#F%,BGET#F%,BGET#F%
7940NEXT
7950CLOSE#F%
7960ENDPROC
7970:
7980DEF FNREADDIR(P$)  :REM  READ DIRECTORY INFO INTO DICT$ FROM DPOINT%(27)+2
7990LOCAL D%,XOFF%,S$,P%,NE%,S2%,DP%,NO%
8000LOCAL ERROR
8010:
8020ON ERROR LOCAL =-1
8030DP%=DPOINT%(27)+1
8040DICT$(DP%-1)=" "
8050S2$=" "
8060XOFF%=0
8070NE%=0
8080:
8090REPEAT
8100SYS "OS_GBPB",10,P$,BLOCK%,1,XOFF%,100,"*" TO D%,D%,D%,D%,XOFF%
8110S$=""
8120P%=&14
8130:
8140REPEAT
8150D%=BLOCK%?P%
8160P%+=1
8170IF D%<>0 THEN S$=S$+CHR$(D%)
8180UNTIL D%=0
8190:
8200IF LEN(S$)<=6 AND XOFF%<>-1 THEN
8210NE%+=1
8220S2$+=S$
8230P%=(LEN(S2$)-1)/7
8240CASE P% OF
8250WHEN 0: S2$=LEFT$(S2$+"         ",8)
8260WHEN 1: S2$=LEFT$(S2$+"         ",15)
8270WHEN 2: S2$=LEFT$(S2$+"         ",22)
8280WHEN 3: S2$=LEFT$(S2$+"         ",29)
8290WHEN 4: S2$=LEFT$(S2$+"         ",36):DICT$(DP%)=S2$:S2$=" ":DP%+=1
8300ENDCASE
8310ENDIF
8320:
8330UNTIL XOFF%=-1
8340DICT$(DP%)=S2$
8350FOR P%=DP%+1 TO DP%+7
8360DICT$(P%)=" "
8370NEXT
8380=NE%
